/*
  Programa GEFE - Gestión de eventos lúdicos.
  Copyright (C) 2010  Antonio Ramírez Marti

  This program is free software: you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation, either version 3 of the License, or
  (at your option) any later version.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

#include "acolitoactividades.h"
#include "ui_acolitoactividades.h"

#include <QMessageBox>
#include <QSqlQuery>
#include <QSqlError>
#include <QList>
#include <QVector>
#include <QStandardItem>
#include <QVariant>
#include <QVariantList>
#include <QDebug>
#include <QInputDialog>

#include <fichasdialog.h>

AcolitoActividades::AcolitoActividades(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::AcolitoActividades)
{
    ui->setupUi(this);
    setup();
}

AcolitoActividades::~AcolitoActividades()
{
    delete ui;
}

void AcolitoActividades::changeEvent(QEvent *e)
{
    QWidget::changeEvent(e);
    switch (e->type()) {
    case QEvent::LanguageChange:
        ui->retranslateUi(this);
        break;
    default:
        break;
    }
}

/*!
  Prepara al acolito al crearse
  */

void AcolitoActividades::setup()
{
    init();
    creaModelos();
    preparaBotonEstados();
    estableceConexiones();
}

/*!
  Estado inicial
  */

void AcolitoActividades::init()
{
    this->modelo=0;
    this->mapper=0;
    this->botonesMapper=0;
    this->flagConexion=false;
    this->filtro=0;

    connect(ui->fichaButton,SIGNAL(clicked()),this,SLOT(enviarActividad()));
}

/*!
  Crea los modelos
  */

void AcolitoActividades::creaModelos()
{

    this->borraModelos();

    modelo=new ModeloActividades(this,QSqlDatabase::database("evento",true));
    modelo->setEditStrategy(QSqlTableModel::OnFieldChange);

    modelo->setSort(ModeloActividades::Nombre,Qt::AscendingOrder);
    mapper=new QDataWidgetMapper(this);
    botonesMapper=new QSignalMapper(this);
    filtro=new QSortFilterProxyModel(this);

    // Conecta modelo base con el filtro
    modelo->select();
    filtro->setSourceModel(modelo);
    filtro->setFilterKeyColumn(ModeloActividades::Nombre);

    // Conecta el mapper al modelo filtrado
    mapper->setModel(filtro);
}

/*!
  Elimina los modelos
  */

void AcolitoActividades::borraModelos()
{
    if(QSqlDatabase::contains("evento"))
        QSqlDatabase::database("evento",false).close();

    if(modelo)
    {
        delete modelo;
        modelo=0;
    }

    if(mapper)
    {
        delete mapper;
        mapper=0;
    }

    if(botonesMapper)
    {
        delete botonesMapper;
        botonesMapper=0;
    }

    if(filtro)
    {
        delete filtro;
        filtro=0;
    }

    ui->asociacionComboBox->clear();
    ui->lugarComboBox->clear();
}

/*!
  Establece las conexiones entre los distintos elementos
  */

void AcolitoActividades::estableceConexiones()
{

    // Conectar el calendario
    connect(ui->calendarWidget,SIGNAL(dateChanged(QDate)),ui->calendario,SLOT(setSelectedDate(QDate)));

    // Conectar el filtro del modelo con la linea del texto de busqueda
    filtro->setFilterCaseSensitivity(Qt::CaseInsensitive);
    connect(ui->buscarActividadLine,SIGNAL(textChanged(QString)),filtro,SLOT(setFilterFixedString(QString)));

    // Conecta el mapper con el modelo filtrado
    mapper->addMapping(ui->nombreLine,ModeloActividades::Nombre);
    mapper->addMapping(ui->asociacionComboBox,ModeloActividades::Asociacion,"indexBasedText");
    mapper->addMapping(ui->responsableLine,ModeloActividades::Responsable);
    mapper->addMapping(ui->maxSpinBox,ModeloActividades::MaxPart);
    mapper->addMapping(ui->minSpinBox,ModeloActividades::MinPart);
    mapper->addMapping(ui->descripcionEdit,ModeloActividades::Descripcion);
    mapper->addMapping(ui->calendarWidget,ModeloActividades::Dia);
    mapper->addMapping(ui->initTime,ModeloActividades::HoraInicio);
    mapper->addMapping(ui->endTime,ModeloActividades::HoraFin);
    mapper->addMapping(ui->lugarComboBox,ModeloActividades::Localizacion,"indexBasedText");
    mapper->addMapping(ui->colaboradoresEdit,ModeloActividades::Coorganizadores);
    mapper->addMapping(ui->mPropioEdit,ModeloActividades::MPropio);
    mapper->addMapping(ui->mAjenoEdit,ModeloActividades::MAjeno);
    mapper->addMapping(ui->presupuestoSpinBox,ModeloActividades::Presupuesto);
    mapper->addMapping(ui->espacioEdit,ModeloActividades::Espacio);
    mapper->addMapping(ui->requisitosEdit,ModeloActividades::Requisitos);
    mapper->addMapping(ui->observacionesEdit,ModeloActividades::Observaciones);
    mapper->addMapping(ui->mJuegoEdit,ModeloActividades::MundoJuego);
    mapper->addMapping(ui->epocaEdit,ModeloActividades::Epoca);
    mapper->addMapping(ui->estadoCombo,ModeloActividades::Estado,"currentIndex");

    mapper->toFirst();
    mapper->setSubmitPolicy(QDataWidgetMapper::AutoSubmit);

    // Conecta el boton de estado con el comboBox de estado
    connect(ui->estadoCombo,SIGNAL(currentIndexChanged(int)),ui->estadoActividad,SLOT(setEstado(int)));

    // Conecta el botón para crear asociaciones
    disconnect(ui->nuevaAsoButton,"clicked",this,"nuevaAsociacion");
    connect(ui->nuevaAsoButton,SIGNAL(clicked()),this,SLOT(nuevaAsociacion()));

    // Conecta la vista con el modelo filtrado
    ui->vistaActividad->setModel(filtro);
    ui->vistaActividad->setModelColumn(ModeloActividades::Nombre);

    // Conecta la vista con el mapper
    connect(ui->vistaActividad->selectionModel(),SIGNAL(currentRowChanged(QModelIndex,QModelIndex)),mapper,SLOT(setCurrentModelIndex(QModelIndex)));
    ui->vistaActividad->setCurrentIndex(filtro->index(0,0));

    ui->vistaActividad->setAlternatingRowColors(true);

    // Conecta los botones al mapper de señales
    connect(ui->nextButton,SIGNAL(clicked()),botonesMapper,SLOT(map()));
    connect(ui->previousButton,SIGNAL(clicked()),botonesMapper,SLOT(map()));

    botonesMapper->setMapping(ui->nextButton,1);
    botonesMapper->setMapping(ui->previousButton,0);

    // Conecta la señal del mapper al slot correspondiente
    connect(botonesMapper,SIGNAL(mapped(int)),this,SLOT(cambiaPagina(int)));
    connect(ui->paginaComboBox,SIGNAL(currentIndexChanged(int)),this,SLOT(setPaginaActual(int)));

}

/*!
  Devuelve el estado de conexion del acolito
  @return bool
    - @b TRUE: Está conectado
    - @b FALSE: Está desconectado
  @note No modifica el objeto
  */

bool AcolitoActividades::isConectado() const
{
    return this->flagConexion;
}

void AcolitoActividades::setConectado(bool estado)
{
    switch(estado)
    {
    case true:      //Conectar
        this->borraModelos();
        this->creaModelos();
        this->estableceConexiones();
        this->preparaCalendario();
        this->preparaBusquedas();
        this->recargaAsociaciones();
        this->recargaLugares();
        break;
    case false:     //Desconectar
        this->borraModelos();
        break;
    default:
        break;
    }
    this->flagConexion=estado;
}

void AcolitoActividades::setIntervaloFechas(QPair<QDate, QDate>intervalo)
{
    ui->calendarWidget->setMinimumDate(intervalo.first);
    ui->calendarWidget->setMaximumDate(intervalo.second);

    ui->calendario->setDateRange(intervalo.first,intervalo.second);
}

void AcolitoActividades::preparaCalendario()
{
    {
        QSqlQuery query(QSqlDatabase::database("evento",true));

        query.prepare("SELECT inicio,fin FROM evento");

        if(!query.exec())
        {
            QMessageBox::critical(this,"Error de acceso","No se pudo obtener las fechas del evento");
        }
        else
        {
            query.next();

            setIntervaloFechas(QPair<QDate, QDate>(query.value(0).toDate(),query.value(1).toDate()));
        }
    }
}

void AcolitoActividades::preparaBusquedas()
{
    this->modelo->setFilter(QString());
    QDate diaInicio,diaFin,dia;

    ui->actividadTypeCombo->clear();
    ui->actividadDayCombo->clear();


    {
        QSqlQuery query(QSqlDatabase::database("evento",true));

        if(!query.exec("SELECT nombre FROM tipoActividad"))
        {
            QMessageBox::critical(this,"Error de acceso","No se pudo obtener los tipos de actividades del evento");
        }
        else
        {
            ui->actividadTypeCombo->addItem(QString("Todas las actividades"),QVariant());
            while(query.next())
                ui->actividadTypeCombo->addItem(query.value(0).toString(),query.value(0));
        }

        query.clear();

        if(!query.exec("SELECT inicio,fin FROM evento"))
        {
            QMessageBox::critical(this,"Error de acceso","No se pudo obtener los dias del evento");
        }
        else
        {
            ui->actividadDayCombo->addItem(QString("de todos los dias"),QVariant());

            query.next();
            diaInicio=query.value(0).toDate();
            diaFin=query.value(1).toDate();


            dia=diaInicio;

            while(dia!=diaFin)
            {
                ui->actividadDayCombo->addItem(QString("del ")+dia.toString("dddd 'dia' d"),QVariant(dia.toString("yyyy-MM-dd")));
                dia=dia.addDays(1);
            }
            ui->actividadDayCombo->addItem(QString("del ")+dia.toString("dddd 'dia' d"),QVariant(dia.toString("yyyy-MM-dd")));
        }

    }

    connect(ui->actividadDayCombo,SIGNAL(currentIndexChanged(int)),this,SLOT(setSeleccion()));
    connect(ui->actividadTypeCombo,SIGNAL(currentIndexChanged(int)),this,SLOT(setSeleccion()));

}

/*!
  @todo Implementar
  */

void AcolitoActividades::preparaBotonEstados()
{
    QList<QIcon*> listaIconos;
    listaIconos.append(new QIcon(":/iconos/iconos/emblem-cool.png"));
    listaIconos.append(new QIcon(":/iconos//iconos/package-broken.png"));
    listaIconos.append(new QIcon(":/iconos//iconos/monsterz.png"));

    QList<QString> listaTextos;
    listaTextos.append(QString("Correcto. La actividad no ha sufrido cambios."));
    listaTextos.append(QString("La actividad ha sufrido un cambio de horario o de fecha."));
    listaTextos.append(QString("La actividad ha sido cancelada."));

    QList<QString> listaStyles;
    listaStyles.append(QString("EstadoButton"
                               "{"
                                "border: 2px solid grey;"
                                "border-radius: 10px;"
                                       "background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, stop:0 rgba(104, 156, 62, 255), stop:1 rgba(156, 255, 74, 255));"
                               "}"
                               "EstadoButton:hover:!pressed"
                               "{"
                                       "background-color: qlineargradient(spread:repeat, x1:0, y1:0, x2:0.979, y2:1, stop:0 rgba(116, 215, 157, 255), stop:1 rgba(164, 255, 202, 255));"
                               "}"
                               "EstadoButton:pressed"
                               "{"
                                       "background-color: qlineargradient(spread:pad, x1:1, y1:1, x2:0, y2:0, stop:0.184211 rgba(98, 189, 93, 255), stop:1 rgba(123, 255, 126, 255));"
                               "}"));
    listaStyles.append(QString("EstadoButton"
                               "{"
                                "border: 2px solid grey;"
                                "border-radius: 10px;"
                                       "background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, stop:0 rgba(255, 166, 1, 255), stop:1 rgba(243, 255, 0, 255));"
                               "}"
                               "EstadoButton:hover:!pressed"
                               "{"
                                       "background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, stop:0 rgba(255, 190, 70, 255), stop:1 rgba(247, 255, 72, 255));"

                               "}"
                               "EstadoButton:pressed"
                               "{"
                                       "background-color: qlineargradient(spread:pad, x1:1, y1:0, x2:0, y2:0, stop:0 rgba(218, 142, 0, 255), stop:1 rgba(206, 216, 0, 255));"
                               "}"));
    listaStyles.append(QString("EstadoButton"
                               "{"
                                "border: 2px solid grey;"
                                "border-radius: 10px;"
                                       "background-color: qlineargradient(spread:pad, x1:1, y1:1, x2:0, y2:0, stop:0.184211 rgba(189, 0, 0, 255), stop:1 rgba(255, 125, 125, 255));"
                               "}"
                               "EstadoButton:hover:!pressed"
                               "{"
                                       "background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:1, stop:0 rgba(255, 88, 88, 255), stop:1 rgba(195, 45, 45, 255));"
                               "}"
                               "EstadoButton:pressed"
                               "{"
                                       "background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:1, stop:0 rgba(183, 0, 0, 255), stop:1 rgba(153, 0, 0, 255));"
                               "}"));

    ui->estadoActividad->setIconos(listaIconos);
    ui->estadoActividad->setTextos(listaTextos);
    ui->estadoActividad->setStyles(listaStyles);
    /*
    QIcon *icono;
    QString texto,style;

    icono=new QIcon(":/iconos/emblem-cool.png");
    texto=QString("Correcto");

    style=QString("#estadoActividad"
                  "{"
                   "border: 2px solid grey;"
                   "border-radius: 10px;"
                          "background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, stop:0 rgba(104, 156, 62, 255), stop:1 rgba(156, 255, 74, 255));"
                  "}"
                  "#estadoActividad:hover:!pressed"
                  "{"
                          "background-color: qlineargradient(spread:repeat, x1:0, y1:0, x2:0.979, y2:1, stop:0 rgba(116, 215, 157, 255), stop:1 rgba(164, 255, 202, 255));"
                  "}"
                  "#estadoActividad:pressed"
                  "{"
                          "background-color: qlineargradient(spread:pad, x1:1, y1:1, x2:0, y2:0, stop:0.184211 rgba(98, 189, 93, 255), stop:1 rgba(123, 255, 126, 255));"
                  "}");
    ui->estadoActividad->addEstado(icono,style,texto);

    icono=new QIcon(":/iconos/package-broken.png");
    texto=QString("La actividad se ha retrasado");

    style=QString("#estadoActividad"
                  "{"
                   "border: 2px solid grey;"
                   "border-radius: 10px;"
                          "background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, stop:0 rgba(255, 166, 1, 255), stop:1 rgba(243, 255, 0, 255));"
                  "}"
                  "#estadoActividad:hover:!pressed"
                  "{"
                          "background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, stop:0 rgba(255, 190, 70, 255), stop:1 rgba(247, 255, 72, 255));"
                  "}"
                  "#estadoActividad:pressed"
                  "{"
                          "background-color: qlineargradient(spread:pad, x1:1, y1:0, x2:0, y2:0, stop:0 rgba(218, 142, 0, 255), stop:1 rgba(206, 216, 0, 255));"
                  "}");
    ui->estadoActividad->addEstado(icono,style,texto);

    icono=new QIcon(":/iconos/emblem-cool.png");
    texto=QString("Correcto");

    style=QString("#estadoActividad"
                  "{"
                   "border: 2px solid grey;"
                   "border-radius: 10px;"
                          "background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, stop:0 rgba(104, 156, 62, 255), stop:1 rgba(156, 255, 74, 255));"
                  "}"
                  "#estadoActividad:hover:!pressed"
                  "{"
                          "background-color: qlineargradient(spread:repeat, x1:0, y1:0, x2:0.979, y2:1, stop:0 rgba(116, 215, 157, 255), stop:1 rgba(164, 255, 202, 255));"
                  "}"
                  "#estadoActividad:pressed"
                  "{"
                          "background-color: qlineargradient(spread:pad, x1:1, y1:1, x2:0, y2:0, stop:0.184211 rgba(98, 189, 93, 255), stop:1 rgba(123, 255, 126, 255));"
                  "}");
    ui->estadoActividad->addEstado(icono,style,texto);
    */

    connect(ui->estadoActividad,SIGNAL(clicked()),this,SLOT(enviarActividadImprimir()));
}

void AcolitoActividades::setSeleccion()
{
    // Seleccion de tipo de actividad

    QString filtroActividad;
    QString filtroDia;
    QString filtroFinal;

    if(ui->actividadTypeCombo->currentIndex()!=0)       // Diferente a 'Todas las actividades'
        filtroActividad="tipoAct='"+ui->actividadTypeCombo->itemData(ui->actividadTypeCombo->currentIndex()).toString()+"'";

    if(ui->actividadDayCombo->currentIndex()!=0)        // Diferente a todos los días
        filtroDia="dia='"+ui->actividadDayCombo->itemData(ui->actividadDayCombo->currentIndex()).toString()+"'";

    if(!filtroActividad.isEmpty())
        filtroFinal=filtroActividad;

    if(!filtroDia.isEmpty())
    {
        if(!filtroFinal.isEmpty()) filtroFinal+=" AND ";
        filtroFinal+=filtroDia;
    }

    this->modelo->setFilter(filtroFinal);
    mapper->toFirst();
}

void AcolitoActividades::recargaActividadesYDias()
{
    this->preparaBusquedas();
}

void AcolitoActividades::nuevasActividadesDialog()
{
    AddActividadesDialog *dialogo = new AddActividadesDialog(this);

    connect(dialogo,SIGNAL(cambiosTipoActividad()),this,SLOT(recargaActividadesYDias()));
    connect(dialogo,SIGNAL(sendActividades(QStandardItemModel*)),this,SLOT(addActividades(QStandardItemModel*)));
    connect(dialogo,SIGNAL(cambiosAsociaciones()),this,SLOT(recargaAsociaciones()));
    connect(dialogo,SIGNAL(cambiosLugares()),this,SLOT(recargaLugares()));

    dialogo->exec();
}

void AcolitoActividades::addActividades(QStandardItemModel *actividades)
{
    QList<QStandardItem *>actividad;
    QList<QVariantList*> listaDatos;
    int numFilas=actividades->rowCount();

    for(int i=0;i<20;i++)
        listaDatos.append(new QVariantList());

    if(listaDatos.isEmpty())
        QMessageBox::critical(this,"qdebug","LA LISTA ESTA VACIA!!!!!!");

    for(int i=0;i<numFilas;i++)
    {
        actividad=actividades->takeRow(0);
        for(int j=ModeloActividades::Nombre;j<=ModeloActividades::Localizacion;j++)
        {
            QVariant aux=actividad.at(j)->data(Qt::EditRole);
            if(aux.isNull())
                listaDatos.value(j-1)->append(QVariant(QString(" ")));
            else listaDatos.value(j-1)->append(aux);
            //QMessageBox::information(this,"qdebug",actividad.at(j)->data(Qt::EditRole).toString());
        }
        actividad.clear();
    }


    {
        QSqlQuery query(QSqlDatabase::database("evento"));

        QSqlDatabase::database("evento").transaction();


        query.prepare("INSERT INTO actividad"
                      "("
                      "nombre,asociacion,responsable,"
                      "coorganizadores,mPropio,mAjeno,presupuesto,"
                      "espacio,dia,horaInicio,horaFin,"
                      "maxPart,minPart,tipoAct,"
                      "descripcion,mundoJuego,epoca,"
                      "requisitos,observaciones,localizacion"
                      ")"
                      "VALUES"
                      "("+QString("?,").repeated(19)+QString("?)"));

        //qDebug() << query.lastQuery();
       // QMessageBox::information(this,"qdebug",QString::number(listaDatos.count()));
        for(QList<QVariantList*>::iterator it=listaDatos.begin();it!=listaDatos.end();it++)
            query.addBindValue((*(*it)));

        if(!query.execBatch())
        {
            QMessageBox::warning(this,"Error en AcolitoActividades","No se pudo introducir las actividades en el sistema:\n"+query.lastError().text());
            QSqlDatabase::database("evento").rollback();
        }
        else QSqlDatabase::database("evento").commit();

        modelo->select();

        delete actividades;

        for(int i=0;i<20;i++)
            delete listaDatos.value(i);

        listaDatos.clear();
    }

}

void AcolitoActividades::recargaAsociaciones()
{
    ui->asociacionComboBox->clear();

    {
        QSqlQuery query(QSqlDatabase::database("evento"));

        query.exec("SELECT DISTINCT nombre FROM asos");

        while(query.next())
            ui->asociacionComboBox->addItem(query.value(0).toString(),query.value(0));
    }
}

void AcolitoActividades::recargaLugares()
{
    ui->lugarComboBox->clear();
    {
        QSqlQuery query(QSqlDatabase::database("evento"));

        query.exec("SELECT distinct nombre FROM lugar");

        while(query.next())
            ui->lugarComboBox->addItem(query.value(0).toString(),query.value(0));
    }
}

void AcolitoActividades::nuevaAsociacion()
{
    bool ok;
    QString asociacion=QInputDialog::getText(qobject_cast<QWidget*>(this),tr("Añadir nueva asociacion"),tr("Nueva asociacion:"),QLineEdit::Normal,QString(),&ok);

    if(ok && (!asociacion.isEmpty()))
    {
        QSqlQuery query(QSqlDatabase::database("evento"));

        query.prepare("INSERT INTO asos(nombre) VALUES(:asociacion)");

        query.bindValue(":asociacion",asociacion);

        if(!query.exec())
            QMessageBox::warning(this,"Problema en añadir asociaciones","No se pudo añadir la asociacion al sistema.");
        else recargaAsociaciones();
    }
}

int AcolitoActividades::getPaginaActual() const
{
    return ui->stackedWidget->currentIndex();
}

void AcolitoActividades::setPaginaActual(int pagina)
{
    ui->stackedWidget->setCurrentIndex(pagina);

    if(!ui->stackedWidget->currentIndex())  // Primera pagina
    {
        ui->previousButton->setEnabled(false);
        ui->nextButton->setEnabled(true);
    }
    else if(ui->stackedWidget->currentIndex()==ui->stackedWidget->count()-1)
    {
        ui->nextButton->setEnabled(false);
        ui->previousButton->setEnabled(true);
    }
    else
    {
        ui->nextButton->setEnabled(true);
        ui->previousButton->setEnabled(true);
    }
}

void AcolitoActividades::cambiaPagina(int avanza)
{
    if(avanza)
        ui->paginaComboBox->setCurrentIndex(ui->paginaComboBox->currentIndex()+1);
    else ui->paginaComboBox->setCurrentIndex(ui->paginaComboBox->currentIndex()-1);
}

void AcolitoActividades::enviarActividad()
{
    {
        QSqlQuery query(QSqlDatabase::database("evento"));

        query.exec("SELECT * FROM actividad where nombre='"+ui->nombreLine->text()+"'");
        query.first();

        emit this->solicitudFicha(query.record());
    }
}

void AcolitoActividades::enviarActividadImprimir()
{
    {
        QSqlQuery query(QSqlDatabase::database("evento"));

        query.exec("SELECT * from actividad where nombre='"+ui->nombreLine->text()+"'");
        query.first();

        emit this->solicitudImprimeFicha(query.record());
    }
}

void AcolitoActividades::fichasDelDiaDialog()
{
    FichasDialog *dialog=new FichasDialog(this);

    connect(dialog,SIGNAL(sendActividades(QSqlQuery,QString)),this,SIGNAL(solicitudListaFichas(QSqlQuery,QString)));
    connect(dialog,SIGNAL(sendSala(QSqlQuery,QString,QString)),this,SIGNAL(solicitudListaSala(QSqlQuery,QString,QString)));
    connect(dialog,SIGNAL(sendImprimirActividades(QSqlQuery)),this,SIGNAL(solicitudImprimeListaFichas(QSqlQuery)));
    connect(dialog,SIGNAL(sendSalaImprimir(QSqlQuery,QString,QPrinter*)),this,SIGNAL(solicitudImprimeSala(QSqlQuery,QString,QPrinter*)));

    dialog->exec();
    delete dialog;
}
